From 3f441c6c029553d990c01582fe724ebd2be71b9f Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 6 Feb 2009 11:15:28 +0000 Subject: [PATCH] x86: Clean up page-mfn conversion macros to allow better override by shadow code. Also fix is_xen_heap_mfn() to deal with invalid MFNs. Signed-off-by: Keir Fraser --- xen/arch/x86/mm/hap/hap.c | 6 ++--- xen/arch/x86/mm/p2m.c | 6 ++--- xen/arch/x86/mm/paging.c | 6 ++--- xen/arch/x86/mm/shadow/private.h | 17 +++++--------- xen/include/asm-x86/mm.h | 3 ++- xen/include/asm-x86/page.h | 38 +++++++++++++++++++++++--------- 6 files changed, 43 insertions(+), 33 deletions(-) diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 53cfed52ec..b753e7af59 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -45,11 +45,11 @@ /* Override macros from asm/page.h to make them work with mfn_t */ #undef mfn_to_page -#define mfn_to_page(_m) (frame_table + mfn_x(_m)) +#define mfn_to_page(_m) __mfn_to_page(mfn_x(_m)) #undef mfn_valid -#define mfn_valid(_mfn) (mfn_x(_mfn) < max_page) +#define mfn_valid(_mfn) __mfn_valid(mfn_x(_mfn)) #undef page_to_mfn -#define page_to_mfn(_pg) (_mfn((_pg) - frame_table)) +#define page_to_mfn(_pg) _mfn(__page_to_mfn(_pg)) /************************************************/ /* HAP LOG DIRTY SUPPORT */ diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 660c6ca6ed..e7baa62720 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -89,11 +89,11 @@ /* Override macros from asm/page.h to make them work with mfn_t */ #undef mfn_to_page -#define mfn_to_page(_m) (frame_table + mfn_x(_m)) +#define mfn_to_page(_m) __mfn_to_page(mfn_x(_m)) #undef mfn_valid -#define mfn_valid(_mfn) (mfn_x(_mfn) < max_page) +#define mfn_valid(_mfn) __mfn_valid(mfn_x(_mfn)) #undef page_to_mfn -#define page_to_mfn(_pg) (_mfn((_pg) - frame_table)) +#define page_to_mfn(_pg) _mfn(__page_to_mfn(_pg)) /* PTE flags for the various types of p2m entry */ diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index 1405f29ce0..2b898dd73b 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -47,11 +47,11 @@ /************************************************/ /* Override macros from asm/page.h to make them work with mfn_t */ #undef mfn_to_page -#define mfn_to_page(_m) (frame_table + mfn_x(_m)) +#define mfn_to_page(_m) __mfn_to_page(mfn_x(_m)) #undef mfn_valid -#define mfn_valid(_mfn) (mfn_x(_mfn) < max_page) +#define mfn_valid(_mfn) __mfn_valid(mfn_x(_mfn)) #undef page_to_mfn -#define page_to_mfn(_pg) (_mfn((_pg) - frame_table)) +#define page_to_mfn(_pg) _mfn(__page_to_mfn(_pg)) /* The log-dirty lock. This protects the log-dirty bitmap from * concurrent accesses (and teardowns, etc). diff --git a/xen/arch/x86/mm/shadow/private.h b/xen/arch/x86/mm/shadow/private.h index 0ac0858eba..abc820216a 100644 --- a/xen/arch/x86/mm/shadow/private.h +++ b/xen/arch/x86/mm/shadow/private.h @@ -474,20 +474,13 @@ mfn_t oos_snapshot_lookup(struct vcpu *v, mfn_t gmfn); * MFN/page-info handling */ -// Override mfn_to_page from asm/page.h, which was #include'd above, -// in order to make it work with our mfn type. +/* Override macros from asm/page.h to make them work with mfn_t */ #undef mfn_to_page -#define mfn_to_page(_m) (frame_table + mfn_x(_m)) - -// Override page_to_mfn from asm/page.h, which was #include'd above, -// in order to make it work with our mfn type. -#undef page_to_mfn -#define page_to_mfn(_pg) (_mfn((_pg) - frame_table)) - -// Override mfn_valid from asm/page.h, which was #include'd above, -// in order to make it work with our mfn type. +#define mfn_to_page(_m) __mfn_to_page(mfn_x(_m)) #undef mfn_valid -#define mfn_valid(_mfn) (mfn_x(_mfn) < max_page) +#define mfn_valid(_mfn) __mfn_valid(mfn_x(_mfn)) +#undef page_to_mfn +#define page_to_mfn(_pg) _mfn(__page_to_mfn(_pg)) /* Override pagetable_t <-> struct page_info conversions to work with mfn_t */ #undef pagetable_get_page diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 8c1c675ebf..cde79e948e 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -210,7 +210,8 @@ struct page_info }) #else #define is_xen_heap_page(page) ((page)->count_info & PGC_xen_heap) -#define is_xen_heap_mfn(mfn) is_xen_heap_page(&frame_table[mfn]) +#define is_xen_heap_mfn(mfn) \ + (__mfn_valid(mfn) && is_xen_heap_page(__mfn_to_page(mfn))) #endif #if defined(__i386__) diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index a58a750d07..64b2246995 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -220,31 +220,47 @@ void copy_page_sse2(void *, const void *); copy_page_sse2(_t, _f) : \ (void)memcpy(_t, _f, PAGE_SIZE)) -#define mfn_valid(mfn) ((mfn) < max_page) +#define __mfn_valid(mfn) ((mfn) < max_page) /* Convert between Xen-heap virtual addresses and machine addresses. */ #define __pa(x) (virt_to_maddr(x)) #define __va(x) (maddr_to_virt(x)) /* Convert between Xen-heap virtual addresses and machine frame numbers. */ -#define virt_to_mfn(va) (virt_to_maddr(va) >> PAGE_SHIFT) -#define mfn_to_virt(mfn) (maddr_to_virt((paddr_t)(mfn) << PAGE_SHIFT)) +#define __virt_to_mfn(va) (virt_to_maddr(va) >> PAGE_SHIFT) +#define __mfn_to_virt(mfn) (maddr_to_virt((paddr_t)(mfn) << PAGE_SHIFT)) /* Convert between machine frame numbers and page-info structures. */ -#define mfn_to_page(mfn) (frame_table + (mfn)) -#define page_to_mfn(pg) ((unsigned long)((pg) - frame_table)) +#define __mfn_to_page(mfn) (frame_table + (mfn)) +#define __page_to_mfn(pg) ((unsigned long)((pg) - frame_table)) /* Convert between machine addresses and page-info structures. */ -#define maddr_to_page(ma) (frame_table + ((ma) >> PAGE_SHIFT)) -#define page_to_maddr(pg) ((paddr_t)((pg) - frame_table) << PAGE_SHIFT) +#define __maddr_to_page(ma) (frame_table + ((ma) >> PAGE_SHIFT)) +#define __page_to_maddr(pg) ((paddr_t)((pg) - frame_table) << PAGE_SHIFT) /* Convert between Xen-heap virtual addresses and page-info structures. */ -#define virt_to_page(va) (frame_table + (__pa(va) >> PAGE_SHIFT)) -#define page_to_virt(pg) (maddr_to_virt(page_to_maddr(pg))) +#define __virt_to_page(va) (frame_table + (__pa(va) >> PAGE_SHIFT)) +#define __page_to_virt(pg) (maddr_to_virt(page_to_maddr(pg))) /* Convert between frame number and address formats. */ -#define pfn_to_paddr(pfn) ((paddr_t)(pfn) << PAGE_SHIFT) -#define paddr_to_pfn(pa) ((unsigned long)((pa) >> PAGE_SHIFT)) +#define __pfn_to_paddr(pfn) ((paddr_t)(pfn) << PAGE_SHIFT) +#define __paddr_to_pfn(pa) ((unsigned long)((pa) >> PAGE_SHIFT)) + +/* + * We define non-underscored wrappers for above conversion functions. These are + * overridden in various source files while underscored versions remain intact. + */ +#define mfn_valid(mfn) __mfn_valid(mfn) +#define virt_to_mfn(va) __virt_to_mfn(va) +#define mfn_to_virt(mfn) __mfn_to_virt(mfn) +#define mfn_to_page(mfn) __mfn_to_page(mfn) +#define page_to_mfn(pg) __page_to_mfn(pg) +#define maddr_to_page(ma) __maddr_to_page(ma) +#define page_to_maddr(pg) __page_to_maddr(pg) +#define virt_to_page(va) __virt_to_page(va) +#define page_to_virt(pg) __page_to_virt(pg) +#define pfn_to_paddr(pfn) __pfn_to_paddr(pfn) +#define paddr_to_pfn(pa) __paddr_to_pfn(pa) #endif /* !defined(__ASSEMBLY__) */ -- 2.30.2